import { ApiProperty } from '@nestjs/swagger'
import { IsEnum, IsNumber, IsOptional, IsString } from 'class-validator'
import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
import { IsDateByUtils } from '@/common/decorator/utils.decorator'
import { EEnableStatus } from '@/shared/types/globalEnum'

export enum ENoticeBorderStyle {
  NONE = 'NONE',
  SOLID = 'SOLID',
  DOTTED = 'DOTTED',
  DASHED = 'DASHED',
}

export enum ENoticeType {
  /** 最新 */
  LATEST = 'LATEST',
  /** 新闻 */
  NEWS = 'NEWS',
  /** 公告 */
  NOTICE = 'NOTICE',
  /** 攻略 */
  GUIDE = 'GUIDE',
}

@Entity('notice')
export class Notice {
  @PrimaryGeneratedColumn('increment')
  @IsNumber()
  noticeId: number

  /**
   * 公告标题
   */
  @Column()
  @IsString()
  noticeTitle: string

  /**
   * 显示时间
   */
  @Column()
  @IsDateByUtils()
  noticeShowTime: string

  /**
   * 公告内容
   */
  @Column({
    type: 'longtext',
  })
  @IsString()
  noticeContent: string

  /**
   * 公告分类
   */
  @Column()
  @IsEnum(ENoticeType)
  @IsOptional()
  noticeType?: ENoticeType

  /**
   * 是否置顶
   */
  @ApiProperty({ default: EEnableStatus.DISABLED })
  @Column({ default: EEnableStatus.DISABLED })
  @IsEnum(EEnableStatus)
  @IsOptional()
  noticeIsTop?: EEnableStatus

  /** 背景颜色 */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  noticeBackgroundColor?: string

  /**
   * 标题颜色
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  noticeTitleColor?: string

  /**
   * 内容颜色
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  noticeContentColor?: string

  /**
   * 边框样式
   * NONE 无边框
   * SOLID 实线
   * DOTTED 虚线
   * DASHED 点线
   */
  @ApiProperty({ default: ENoticeBorderStyle.NONE })
  @Column({ default: ENoticeBorderStyle.NONE })
  @IsEnum(ENoticeBorderStyle)
  @IsOptional()
  noticeBorderStyle?: ENoticeBorderStyle

  @CreateDateColumn()
  createdAt?: Date

  @UpdateDateColumn()
  updatedAt?: Date

  // @Exclude()
  // @BeforeInsert()
  // private setDefaultNoticeType(): void {
  // ⚠️ 注意：这里用 private/protected 修饰符
  //   if (!this.noticeType) {
  //     this.noticeType = ENoticeType.LATEST
  //   }
  // }
}

@Entity('notice_config')
export class NoticeConfig {
  @PrimaryGeneratedColumn('increment')
  @IsNumber()
  noticeConfigId: number

  /**
   * 内容顶部图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  noticeContentTopUrl?: string

  /**
   * 内容底部图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  noticeContentBottomUrl?: string

  @UpdateDateColumn()
  updatedAt?: Date
}
